﻿#pragma once
#ifndef __CSPRITE_H_
#define __CSPRITE_H_

#include <d3d9.h>
#include <d3dx9.h>
#include "CDefine.h"

class CSprite
{
protected:
	#pragma region :==Biến==:

	IDResource _ID;							// ID của Sprite trong IM
	LPDIRECT3DTEXTURE9 _Image;				// hình của sprite
	LPD3DXSPRITE _SpriteHandler;			// xử lý Sprite

	int _CurFrame;							// Current sprite index
	int _Width;								// Sprite width
	int _Height;							// Sprite height
	int _TotalFrame;						// Number of sprites
	int _SpritePerRow;						// Number of sprites per row								
	D3DXVECTOR2 _Position;					// vị trí của sprite
	D3DXVECTOR2 _Scale;						// Tâm scale
	D3DXVECTOR2 _Rotation;					// Tâm xoay
	float _Depth;							// Độ sâu của sprite
	float _Angle;							// Độ Xoay
	D3DCOLOR _Color;						// Màu sprite
	
	RECT _SrcRect;
	#pragma endregion -- Khai báo biến

public: 
	#pragma region :==Set & Get==:

	// phương thức get để truy cập biến
	LPDIRECT3DTEXTURE9 getImage()	{return _Image;}
	LPD3DXSPRITE getSpriteHandler() {return _SpriteHandler;}
	int getCurFrame()				{return _CurFrame;}
	int getWidth()					{return _Width;}
	int getHeight()					{return _Height;}
	int getTotalFrame()				{return _TotalFrame;}						
	int getSpritePerRow()			{return _SpritePerRow;}														
	D3DXVECTOR2 getPosition()		{return _Position;}					
	D3DXVECTOR2 getScale()			{return _Scale;}						
	float getDepth()				{return _Depth;}							
	float getAngle()				{return _Angle;}						
	D3DCOLOR getColor()				{return _Color;}
	RECT getRect()					{return _SrcRect;}

	//Phương thức set để thiết lập biến
	void setImage(LPDIRECT3DTEXTURE9 value)		{_Image = value;}
	void setSpriteHandler(LPD3DXSPRITE value)	{_SpriteHandler = value;}
	void setCurFrame(int value)					{_CurFrame = value;}
	void setWidth(int value)					{_Width = value;}
	void setHeight(int value)					{_Height = value;}
	void setTotalFrame(int value)				{_TotalFrame = value;}						
	void setSpritePerRow(int value)				{_SpritePerRow = value;}														
	void setPosition(D3DXVECTOR2 value)			{_Position = value;}					
	void setScale(D3DXVECTOR2 value)			{_Scale = value;}						
	void setDepth(float value)					{_Depth = value;}							
	void setAngle(float value)					{_Angle = value;}						
	void setColor(D3DCOLOR value)				{_Color = value;}
	void setRect(int left, int top, int right, int bottom)	{_SrcRect.left = left; _SrcRect.right =_SrcRect.left + right; _SrcRect.top = top; _SrcRect.bottom = _SrcRect.top + bottom;}

	#pragma endregion  -- Lấy và nhập biến

	#pragma region :==Cons & Des==:

	// Hàm tạo
	CSprite(IDResource ID, int _TotalFrame, int SpritePerRow, int FrameWidth, int FrameHeight);
	CSprite(const CSprite &_copy);  // hàm copy nhằm lầy sprite trong Image Manager ra.
	
	// Hàm hủy
	CSprite();
	~CSprite();
	#pragma endregion -- Hàm tạo và Hàm hủy

	#pragma region :==Load Image==:

	// Load hình vào csprite
	void Init(LPDIRECT3DDEVICE9 _d3ddv, LPCSTR FilePath, int FrameStart, int FrameEnd, float TimeAnimation);
	LPDIRECT3DTEXTURE9 LoadImage(LPDIRECT3DDEVICE9 _d3ddv, LPCSTR FilePath);
	#pragma endregion -- tải hình lên sprite

	#pragma region :==Update==:
	
	// cập nhật sang frame hiện tại
	void Update( int CurFrame);
	#pragma endregion  -- Cập nhật

	#pragma region :== Render ==:

	void Render (LPD3DXSPRITE SpriteHandler);	// thực thi thông thường cho tất cả các đối tượng
	void Render(LPD3DXSPRITE _SpriteHandler,float X, float Y);   // thực thi cho các đối tượng được điều khiển như Mario tại vị trí X, Y
	#pragma endregion   -- Vẽ sprite

	#pragma region :==Sub Function==:

	// lấy khung bao của sprite để xét va chạm
	RECT getBoundingBox();
	#pragma endregion -- các hàm phụ của sprite
};

#endif